package com.tsk.example.result;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

/**
 * @author: 黄嘉振
 * @create: 2023/3/7 16:36
 * @description:    对 Controller 返回的内容在 HttpMessageConverter 进行类型转换之前拦截，统一响应结果形式
 *                  可放在公共模块如common包中，使依赖common包的子模块都统一响应格式，需使用自动装配调起（记得一并配上 WebMvcConfigurer）
 *                  注意需要配置basePackages路径，如果不配，则是对所有的请求都进行统一响应格式，会影响到如swagger的功能
 **/
@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        // 自行实现需要转换的逻辑，如果存量接口没有做统一处理，这里的逻辑可以反过来，需要统一响应格式的接口才添加注解
//        if (methodParameter.getDeclaringClass().isAnnotationPresent(IgnoreTarget.class)) {
//            return false;
//        }
//        if (methodParameter.getMethod().isAnnotationPresent(IgnoreTarget.class)) {
//            return false;
//        }
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        if (body instanceof Result) {
            return body;
        }
        System.out.println("=====advice: " + body);
        Result<Object> success = Result.success(body);
        System.out.println("=====res: " + success);
        return success;
    }
}
